#include "protect.h"
//创建链表函数
int creat_node (node_t **p,int num){
    if (NULL == p){
        printf("入参为空 错误\n");
        return -1;
    }
    *p = (node_t *)malloc(sizeof(node_t));
    if (NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    (*p)->data = num;
    (*p)->next = NULL;
    return 0;
}
//打印链表元素函数
int printf_list (node_t *phead){
    if(NULL == phead){
        printf("入参为空 错误\n");
        return -1;
    }
    node_t *ptemp = phead->next;
    while(NULL != ptemp){
        printf("%d ",ptemp->data);
        ptemp = ptemp->next;
    }
    printf("\n");
    return 0;
}
//在链表头部插入元素
int insert_list_by_head (node_t *phead,int num){
    if(NULL == phead){
        return -1;
    }
//需要创建节点才能插入元素
  node_t *pnew = NULL;
  creat_node(&pnew,num);
  pnew->next = phead->next;
  phead->next = pnew;
  return 0;
}
//在链表尾部插入元素
int insert_list_by_tail (node_t *phead,int num){
    if(NULL == phead){
        return -1;
    }
//需要先遍历一次链表，找到尾插节点
//定义一个临时变量
    node_t *ptemp = phead;//如果只有一个节点，ptemp=phead->next会报错
    while(NULL != ptemp->next){
        ptemp = ptemp->next;
    }
//创建新节点
    node_t *pnew = NULL;
    creat_node(&pnew,num);
    ptemp->next = pnew;
    return 0;
}
//在链表任意位置插入元素
int insert_list_by_pos(node_t *phead,int pos,int num){
    if(NULL == phead){
    return -1;
    }
    if(pos<0){
    printf("位置不合理\n");
    return -1;
    }
//定义临时变量用来判断节点左右两边是否可以插入元素
    node_t *ptemp = phead;
//在链表中插入元素需要保证ptemp->next不为Null
    int i=0;
    for(i=0;i<pos;i++){
        if(NULL == ptemp->next){
            printf("位置不合理\n");
            return -1;
        }
        ptemp = ptemp->next;
    }
//需要创建新节点
        node_t *pnew = NULL;
        creat_node(&pnew,num);
        pnew->next = ptemp->next;
        ptemp->next = pnew;
        return 0;
}
//链表的头删函数
    int  delete_list_by_head(node_t *phead){
        if(NULL == phead){
            return -1;
        }
        if(NULL == phead->next){
            printf("表空\n");
            return -1;
        }
        node_t *pdel = phead->next;
        phead->next = phead->next->next;
        free(pdel);
        pdel = NULL;
        return 0;
    }
//链表尾删函数
    int delete_list_by_tail(node_t *phead){
        if(NULL == phead){
            return -1;
        }
        if(NULL == phead->next){
            printf("表空\n");
            return -1;
        }
    //遍历链表用while,找到倒数第二个节点
        node_t *ptemp = phead;
        while(NULL != ptemp->next->next){
            ptemp = ptemp->next;
        }
        free(ptemp->next);
        ptemp->next = NULL;
        return 0;
    }
//链表任意位置删除元素函数
    int delete_list_by_pos(node_t *phead, int pos){
        if(NULL == phead){
            return -1;
        }
        if(NULL == phead->next){
            printf("表空\n");
            return -1;
        }
        if(pos<0){
            printf("位置不合理\n");
            return -1;
        }
        node_t *ptemp = phead;
        int i = 0;
        for(i = 0; i < pos; i++){
            if(NULL == ptemp->next->next){
                printf("位置不合理 删除失败\n");
                return -1;
            }
            ptemp = ptemp->next;
        }
            node_t *pdel = ptemp->next;
            ptemp->next = pdel->next;
            free(pdel);
            pdel = NULL;
            return 0;
    }
// 修改链表指定位置的元素
int modify_list_by_pos(node_t *phead, int pos, int new_num){
    if(NULL == phead){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(NULL == phead->next){
        printf("表空 修改失败\n");
        return -1;
    }
    if(pos < 0){
        printf("位置不合理 修改失败\n");
        return -1;
    }
    node_t *ptemp = phead;
    int i = 0;
    for(i = 0; i < pos; i++){
        if(NULL == ptemp->next->next){
            printf("位置不合理 修改失败\n");
            return -1;
        }
        ptemp = ptemp->next;
    }
    ptemp->next->data = new_num;
    return 0;
}
// 查找链表指定位置的元素函数
int search_list_by_pos(node_t *phead, int pos, int *buff){
    if(NULL == phead || NULL == buff){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(NULL == phead->next){
        printf("表空 查找失败\n");
        return -1;
    }
    if(pos < 0){
        printf("指定的位置没有元素\n");
        return -1;
    }
    node_t *ptemp = phead;
    int i = 0;
    for(i = 0; i < pos; i++){
        if(NULL == ptemp->next->next){
            printf("指定的位置没有元素\n");
            return -1;
        }
        ptemp = ptemp->next;
    }
    *buff = ptemp->next->data;
    return 0;
}
// 链表剔重
int tichong_list(node_t *phead){
    if(NULL == phead){
        return -1;
    }
    if(NULL == phead->next){
        return -1;
    }
    if(NULL == phead->next->next){
        printf("链表只有一个数据节点 无需排序\n");
        return -1;
    }
    node_t *p = phead->next;
    node_t *q = p->next;
    node_t *m = p;
    while(NULL != p){
          m = p;
          q = p->next;
        while (NULL != q)
        {
            if(p->data == q->data){
                m->next = q->next;

                free(q);
                q = m->next;
            }
            else{
                m = m->next;
                q = q->next;
               
            }
        }
       p = p->next;
    }
    return 0;
}